﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 事件
{
    /// <summary>
    /// 事件是特殊的委托
    /// 事件的作用是希望一个类的某些成员在发生某些变化时能够被外界观测到
    /// 
    /// 定义事件的步骤：
    /// 1、定义事件委托的类型，传入参数的类型，有无返回值
    /// 2、在类的内部声明事件，在类的外部声明委托；
    /// public delegate void AlarmEventHandle()声明了一个报警委托，没有返回值
    /// public event AlarmEventHandle AlarmRaised；声明了事件，关键词是event，
    /// 事件的命名习惯：名词+动词ed；PropetyChanged、TextChanged、EventRaised；
    /// 事件的绑定需要使用+=；委托可以使用=或+=
    /// </summary>
    /// 

    ///事件不可以用invoke触发，需要在定义事件的类的内部声明一个触发事件的方法；
    ///事件就是委托的实例，限定了其执行的权限，只能在事件所在类的内部执行
    ///事件虽然是public，但会被编译成“私有的委托”，只能在类的内部被调用，类的实例不能被调用
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //this.button1.Click += Meth;//订阅了一个事件，按下按钮事件被触发
        }
        public void Meth(Object o,EventArgs e)
        {
            MessageBox.Show("这是一个事件被触发");
            Thread.Sleep(1000);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Alarm alarm = new Alarm();//实例化一个报警类
            alarm.AlarmRaised += Meth2;//通过订阅方法直接调用
            alarm.AlarmRaised += alarm.ShowAlarm;//订阅alarm类下的ShowAlarm方法
            alarm.AlarmRaised += new Person().Doalarm;//订阅person类下的doalarm方法
            alarm.AlarmRaised += () => { MessageBox.Show("这是通过lamda表达式订阅事件"); Thread.Sleep(100); };
            alarm.OnAlarmRaised();
        }
        public void Meth2()
        {
            MessageBox.Show("这是通过订阅调用方法");
        }
    }
}
